package com.example.exploreactivedemo1.practice

import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.example.exploreactivedemo1.R

class ConstraintLayoutDemoActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.constraint_layout_demo)

        val addNewOneButton = findViewById<Button>(R.id.addBtn)
        addNewOneButton.setOnClickListener(){ view ->
            Log.d("buttonClick","Button was clicked")
            addNewView()
        }
    }

    fun addNewView(){
        //1.创建newView，并设置其属性
        var newView = View(this).apply {
            //生成一个自动的唯一的id
            id = View.generateViewId()
            //apply函数就是kotlin标准库函数中的一个高阶函数，称为作用域函数，它允许你在一个对象上执行一个代码块，并且返回对象本身。在
            //代码块内，你可以设置该对象的属性或方法，其中颜色需要转换成toInt()形式才会生效
            setBackgroundColor(0xFFFF00FF.toInt())
            layoutParams = ConstraintLayout.LayoutParams(dpToPx(0),dpToPx(60))
        }

        //2.获取到mainView
        var mainView = findViewById<ConstraintLayout>(R.id.main)

        //3.添加到mainView
        mainView.addView(newView)

        //4.设置约束
        // 获取需要约束需要参照的greenView，因为newView需要在greenView的下方20px，左边与greenView左边对齐，右边与greenView的右边对齐
        //4.1 设置约束之前，先要获取greenView就是被参照对象
        val greenView = findViewById<View>(R.id.greenView)

        val constraintSet = ConstraintSet()
        constraintSet.clone(mainView)

        //新添加的newView的左边与被参照的greenView的左边对齐
        constraintSet.connect(newView.id, ConstraintSet.START, greenView.id , ConstraintSet.START , 0)
        //新添加的newView的右边与被参照的greenView的右边对齐
        constraintSet.connect(newView.id, ConstraintSet.END,greenView.id, ConstraintSet.END,0)
        //新添加的newView的上方与被参照的greenView的下方+30的间距
        constraintSet.connect(newView.id, ConstraintSet.TOP, greenView.id, ConstraintSet.BOTTOM,30)

        //5.最后这些约束都统一添加到mainView上，因为mainView作为父view，包含所有子view及其约束
        constraintSet.applyTo(mainView)
    }

    //dpToPx，dp到px的转换
    fun dpToPx(dp : Int) : Int{
        return (dp * this.resources.displayMetrics.density).toInt()
    }
}